/**
 * 法律数据库的法律模型
 * @module src/schema/law
 */
const mongoose = require("mongoose");

const lawItemTypes = [
  "law",
  "part",
  "subPart",
  "chapter",
  "section",
  "article",
  "paragraph",
  "subParagraph",
  "item",
];

/**
 * 子节点文本版本的模型 - (用于处理修改节点文本)
 */
const textRevisionsSchema = new mongoose.Schema(
  {
    /**
     * 属性名：该版本的文本
     */
    text: { type: String },
    /**
     * 属性名：该版本的修订时间
     */
    revisedAt: { type: Date },
  },
  {
    _id: false,
  }
);

/**
 * 法律条文的子节点模型 (编，分编，章，节，条，款，项，目)
 */
const lawItemSchema = new mongoose.Schema(
  {
    /**
     * 属性名：子节点的标题
     */
    title: { type: String },
    /**
     * 属性名：子节点的类型
     */
    type: {
      type: String,
      enum: lawItemTypes,
    },
    /**
     * 属性名：该项发布时间 - 该法律开始实施时间
     */
    startAt: { type: Date },
    /**
     * 属性名：该项终止时间 - 用来规定法律是否有效
     */
    endAt: { type: Date },
    /**
     * 属性名：当前子节点的父节点
     */
    parent: { type: mongoose.Types.ObjectId, ref: "LawItem" },
    /**
     * 属性名：当前子节点的所有子节点
     */
    children: [{ type: mongoose.Types.ObjectId, ref: "LawItem" }],
    /**
     * 属性名：当前子节点不同版本的文本 - 修改记录
     */
    revisionHistory: [textRevisionsSchema],
    /**
     * 属性名：当前子节点对应的根节点id
     */
    root: { type: mongoose.Types.ObjectId },
    /**
     * 属性名：映射id (搜索的文本对应的法律的id)
     */
    mapping: { type: mongoose.Types.ObjectId },
    /**
     * 属性名：根节点id
     */
    root: { type: mongoose.Types.ObjectId },
  },
  {
    virtuals: {
      /**
       * 属性名：子节点的id - 使用文档的唯一标识符_id作为子节点的id
       */
      id: {
        get() {
          return this._id;
        },
      },
    },
  }
);

/**
 * 法律条文的附件模型
 */
const appendicesSchema = new mongoose.Schema({
  /**
   * 附件的描述
   */
  description: { type: String },
  /**
   * 附件的文本 - 附件的文本是一个list
   */
  text: [{ type: String }],
});

/**
 * 法律条文模型
 */
const lawSchema = new mongoose.Schema(
  {
    /**
     * 属性名：法律的标题
     */
    title: { type: String },
    /**
     * 属性名：法律的颁布时间 - 最新版的法律颁布时间
     */
    publishedAt: { type: Date },
    /**
     * 属性名：法律修订时间 - 存储所有版本法律的修订的时间
     */
    revisedAt: [{ type: Date }],
    /**
     * 属性名：法律的效力级别 (中央，省级，市级，县级)
     */
    effectivenessLevel: { type: String },
    /**
     * 属性名：法律的子节点索引
     */
    children: { type: mongoose.Types.ObjectId, ref: "LawItem" },
    /**
     * 属性名：法律的描述
     */
    description: { type: String },
    /**
     * 属性名：附件
     */
    appendices: [appendicesSchema],
    /**
     * 属性名：法律的出处
     */
    publishDepartment: { type: String },
    /**
     * 属性名：法律是否有效
     */
    isValid: { type: Boolean },
    /**
     * 属性名：映射id (搜索的文本对应的法律的id)
     */
    mapping: { type: mongoose.Types.ObjectId },
  },
  {
    virtuals: {
      /**
       * 法律的id - 使用文档的唯一标识符_id作为法律的id
       */
      id: {
        get() {
          return this._id;
        },
      },
    },
    toJSON: { virtuals: true },
    toObject: { virtuals: true },
  }
);

const Law = mongoose.model("Law", lawSchema);
const LawItem = mongoose.model("LawItem", lawItemSchema);

module.exports = { Law, LawItem };
